package main

import (
	"Ginproject/basic/day01/tree"
	"fmt"
)

// 如何扩充系统类型或者别人的类型
//  定义别名
//  使用组合

//type myTreeNode struct {
//	 *tree.Node  // Embedding 内嵌      这个指针默认名字是：  None
//}

type myTreeNode struct {
	node *tree.Node
}

// 后续遍历
// 组合的方式
func (myNode *myTreeNode) postOrder() {
	if myNode == nil || myNode.node == nil {
		return
	}

	left := myTreeNode{myNode.node.Left}
	right := myTreeNode{myNode.node.Right}

	left.postOrder()
	right.postOrder()
	myNode.node.Print()
}

// Embedding 内嵌

func main() {
	var root tree.Node
	fmt.Println(root)
	root = tree.Node{Value: 3}

	// root := myTreeNode{&tree.Node{Value:3}}      Embedding

	root.Left = &tree.Node{}
	root.Right = &tree.Node{5, nil, nil}
	root.Right.Left = new(tree.Node)
	root.Left.Right = tree.CreateNode(2)

	nodes := []tree.Node{
		{Value: 3},
		{},
		{6, nil, nil},
	}
	fmt.Println(nodes)

	root.Print() // 3
	root.Right.Left.SetValue(4)
	root.Right.Left.Print() // 0

	root.Print()
	root.SetValue(100)

	pRoot := &root
	pRoot.Print()
	pRoot.SetValue(200)
	pRoot.Print()

	var qRoot *tree.Node
	qRoot.SetValue(200)
	qRoot = &root
	qRoot.SetValue(300)
	qRoot.Print()

	root.Loop()

	fmt.Println()
	myRoot := myTreeNode{&root}
	//root.postOreder()     // Embedding
	myRoot.postOrder()
	fmt.Println()

	// 使用内嵌：需要省下许多代码

}
